// 封装一些数学函数
// @author:wangff8@qq.com @date:2024-03-17
library MathUtil

    globals
        // 数学工具专用
        hashtable mathHash = InitHashtable()
    endglobals
    
    // 将指定实数保留指定小数位数，并返回结果（舍弃：如果本身保留本身小数个数的位数精度有问题，比如0.94，保留2位是0.93）
    function keepDecimal takes real x, integer n returns real
        // local temp = 10 ^ (-n)
        // num = num - num % temp
        return x - ModuloReal(x , Pow(10 , -1*n))
    endfunction


    // 判断指定实数是否在数组中
    private function isInArray takes real x, integer pKey, integer key1, integer key2 returns boolean
        local integer i = key1
        loop
            exitwhen i > key2
            if LoadInteger(mathHash, pKey, i) == x then
                return true
            endif
            set i = i + 1        
        endloop
        return false
    endfunction
    // 随机指定范围的不重复的数字 为防止重复每个地方的pKey必须不同，min不能小于0
    // 通常父pkey是StringHash("一个字符串")
    function randomIntToHash1 takes integer min, integer max, integer pKey returns nothing
        local integer i = min
        local integer x = 0

        // 先销毁一次，防止之前使用过的还存在，导致死循环
        call FlushChildHashtable(mathHash, pKey)
        // 全部存储为-1，防止读取0的时候死循环，因为0是默认值
        loop
            exitwhen i > max
            call SaveInteger(mathHash, pKey, i, -1)
            set i = i + 1
        endloop

        set i = min
        loop
            exitwhen i > max
            set x = GetRandomInt(min, max)
            if not isInArray(x, pKey, min, max) then
                call SaveInteger(mathHash, pKey, i, x)
                set i = i + 1
            endif
        endloop
    endfunction
    // 获取随机的范围数
    function getHashRandomInt takes integer pKey, integer key1 returns integer
        return LoadInteger(mathHash, pKey, key1)
    endfunction
    // 使用完要要销毁
    function destroyRandomHash takes integer pKey returns nothing
        call FlushChildHashtable(mathHash, pKey)
    endfunction

endlibrary
